/*
 * @Author: Du Weixing duweixing@sgsimulation.com
 * @Date: 2024-11-08 15:44:34
 * @LastEditors: Du Weixing duweixing@sgsimulation.com
 * @LastEditTime: 2024-11-08 17:22:34
 * @FilePath: \SGFEM\DataStructure\Math\include\MathTools.h
 * @Description:
 *
 * Copyright (c) 2024 by 神工仿真, All Rights Reserved.
 */

#ifndef Algebra_MathTools_h
#define Algebra_MathTools_h

#include "AlgebraModule.h"

// #pragma once
// #include "DataStructure/Common/include/DataStructureExport.h"
// #include "DataStructure/Common/include/DataStructureNamespace.h"
// #include "DataStructure/Common/include/Out.h"
#include "Matrix.h"
#include "Point.h"
#include "Vector3D.h"

SG_NAMESPACE_OPEN
// SG_DATASTRUCTURE_NAMESPACE_OPEN
namespace Algebra
{
    /**
     * @brief 计算局部坐标系变换矩阵
     *
     * 通过右手法则确定局部坐标系，`xVec` 给定 X 轴方向，`orien` 给定 X-Y 平面即 Z 轴
     * @param xVec 局部坐标系 X 轴基向量
     * @param orien 局部坐标系方向向量，用以确定 X-Y 平面
     * @param T 局部坐标系变换矩阵
     */
    ALGEBRA_EXPORT void computeLocalCoordTrans (const Vector3D& xVec, const Vector3D& orien, _OUT Matrixd& T);

    /**
     * @brief 计算通过两个点建立的局部坐标系的变换矩阵
     *
     * 通过两个点确定局部坐标系的 X 轴方向，Y、Z 轴方向可以是与 X 轴垂直的平面内的任意互相垂直的方向
     * @param [in] point1, point2 X 轴方向向量的起点和终点
     * @param [out] T 局部坐标系变换矩阵
     */
    ALGEBRA_EXPORT void computeLocalCoordTrans (const Point& point1,  const Point& point2,  _OUT Matrixd& T);

    /** @brief    计算点到平面的投影
     * 
     * @param    origin  平面上一点
     * @param    n       平面单位法向量
     * @param    point   空间中一点
     * @param[out]    project `point`在 平面上的投影
     * @return   
     * @author   zhangzhiyu
     * @date     2025.01.04
     */
    ALGEBRA_EXPORT void projectPoint2Face (const Point& origin, const Vector3D& n, const Point& point,  _OUT Point& project);

};  // namespace Algebra

SG_NAMESPACE_CLOSE

#endif  // Algebra_MathTools_h